#include "es_adc.h"


es_adc::es_adc(GPIO_TypeDef* gpiox)
    :gpio(gpiox)
{
    RCC_Config();
}

void es_adc::RCC_Config(){
  //设置ADC时钟，最大14M
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
 
 
  //开启ADC1时钟、Timer1时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
}



void es_adc::Init(uint16_t GPIO_Pin,int numberOfChannel){
    //初始化GPIO模式
    gpio.pinMode(GPIO_Pin,GPIO_Mode_AIN);

   //ADC初始化
    ADC_InitTypeDef   ADC_InitS;		//adcG构建

	ADC_InitS.ADC_Mode = ADC_Mode_Independent; 
	ADC_InitS.ADC_ScanConvMode = DISABLE; //多通道(ENABLE)/单通道(DISABLE)
	ADC_InitS.ADC_ContinuousConvMode = DISABLE; //连续(ENABLE)/单次(DISABLE)
	ADC_InitS.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件触发
	ADC_InitS.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
	ADC_InitS.ADC_NbrOfChannel = numberOfChannel; //通道数量(和使用的AIN GPIO数量一致)
	ADC_Init(ADC1, &ADC_InitS);
 
	ADC_Cmd(ADC1,ENABLE);
	ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
	while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
	ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
	while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}


 u16 es_adc::Read(u8 channel){
     ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5);
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//转换结束标志位
	return ADC_GetConversionValue(ADC1);//返回最近一次ADCx规则组的转换结果	
 }






